package net.servir.capacidades.web.controller;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Enumerados;
import net.servir.capacidades.model.ParticipanteBusqueda;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ParticipanteBusquedaController {

	@Autowired
	private CapacidadesService capacidadesService;
	@Autowired
	private CensoService censoService;

	@Autowired
	private MantenimientoService mantenimientoService;

	@RequestMapping("/participanteBusqueda.htm")
	public @ModelAttribute("participanteBusqueda")
	ParticipanteBusqueda participanteBusqueda(HttpServletRequest request)
			throws Exception {

		ParticipanteBusqueda obj = new ParticipanteBusqueda();

		// ************************************************************
		// se obtiene el dni de la session activa
		// ************************************************************
		HttpSession session = request.getSession();
		String cod_session = session.getId();

		String dniResponsable = null;
		if (session.getAttribute("dni") != null)
			dniResponsable = session.getAttribute("dni").toString();

		// Obtenemos los datos del Usuario
		Usuario usuario = null;
		if (session.getAttribute("usuario") != null)
			usuario = (Usuario) session.getAttribute("usuario");

		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");

		System.out.println("session.getAttribute(\"QUERY\")");
		System.out.println(session.getAttribute("QUERY"));
		// ************************************************************
		session.setAttribute("OBJ_RESP_BUSQ", null);
		session.setAttribute("OBJ_SC_BUSQ", null);

		ParticipanteBusqueda objPrevio = null;
		String coddep = null;
		String codpro = null;
		String coddis = null;
		String accion = null;
		String conAmbito = "0";
		String estadoRegistro = null;
		Boolean conCriteriosBusqueda = false;
		Integer idNivelGobierno = 0;
		Integer idSector = 0;
		Integer idEjecutora = null;
		Integer idSistema = 0;
		Integer idAmbito = 0;
		Integer idServicioCivil = null;
		Integer idTest = null;
		// variables nuevas (juank)
		String codRegimen = "";
		String codProfesion = "";
		String fecValidacion = "";
		String fecRegistro = "";
		String correo = "";
		String procedencia = "";
		// String codEstadoParticipante = null;
		// obtener valores del accion de usuario
		coddep = request.getParameter("coddep");
		codpro = request.getParameter("codpro");
		coddis = request.getParameter("coddis");
		estadoRegistro = request.getParameter("estadoRegistro");
		accion = request.getParameter("accion");

		if (request.getParameter("procedencia") != null)
			procedencia = request.getParameter("procedencia");

		if (!procedencia.equals("PARTIC_EDICION")) {
			// codEstadoParticipante =
			// request.getParameter("codEstadoParticipante");
			/*
			 * ================================ llenando los combos profesiones
			 * y regimenes================================
			 */
			LinkedList<Profesion> profesions = capacidadesService
					.ObtenerProfesion();
			LinkedList<Regimen> regimens = capacidadesService.ObtenerRegimen();
			obj.setEstadoRegistro(estadoRegistro);

			obj.setRegimens(regimens);
			obj.setProfesions(profesions);

			obj.setProvincia(capacidadesService.ObtenerProvincias(coddep));
			obj.setDistritos(capacidadesService.ObtenerDistritos(coddep,
					codProfesion));
			obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());

			if (request.getParameter("estadoRegistro") != null)
				obj.setEstadoRegistro(request.getParameter("estadoRegistro"));

			if (request.getParameter("idTest") != null)
				idTest = Integer.parseInt(request.getParameter("idTest"));

			if (accion != null)
				if (accion.equals("RETORNO"))
					accion = null;

			if (accion != null && !accion.equals("")) {
				if (request.getParameter("idNivelGobierno") != null)
					idNivelGobierno = Integer.parseInt(request.getParameter(
							"idNivelGobierno").toString());

				if (request.getParameter("idSector") != null)
					idSector = Integer.parseInt(request
							.getParameter("idSector").toString());

				if (request.getParameter("idServicioCivil") != null
						& !request.getParameter("idServicioCivil").equals(""))
					idServicioCivil = Integer.parseInt(request.getParameter(
							"idServicioCivil").toString());

				if (request.getParameter("lregimen") != null
						&& !request.getParameter("lregimen").trim().equals(""))
					codRegimen = request.getParameter("lregimen");

				if (request.getParameter("lprofesion") != null
						&& !request.getParameter("lprofesion").trim()
								.equals(""))
					codProfesion = request.getParameter("lprofesion");
				if (request.getParameter("fecRegistro") != null
						&& !request.getParameter("fecRegistro").trim()
								.equals(""))
					fecRegistro = request.getParameter("fecRegistro");
				if (request.getParameter("fecValidacion") != null
						&& !request.getParameter("fecValidacion").trim()
								.equals(""))
					fecValidacion = request.getParameter("fecValidacion");
				String ubigeo = "";
				if (coddep != null && !coddep.equals("0"))
					ubigeo = coddep;
				if (codpro != null && !codpro.equals("0"))
					ubigeo += codpro;
				if (coddis != null && !coddis.equals("0"))
					ubigeo += coddis;

				if (request.getParameter("idEjecutora") != null
						& idNivelGobierno != null) // & idPliego != null
				{
					if (!(request.getParameter("idEjecutora").equals(""))) // &
																			// idPliego
																			// !=
																			// 0
					{
						idEjecutora = Integer.parseInt(request.getParameter(
								"idEjecutora").toString());
						obj.setIdEjecutora(idEjecutora);
						obj.setEjecutoras(capacidadesService
								.ObtenerEjecutorasNivelGobierno(
										idNivelGobierno, ubigeo, idSector));
					}
				}
				obj.setCoddep(coddep);

				if (coddep != null) {
					if (!coddep.equals("0")) {
						obj.setCoddep(coddep);
						obj.setProvincias(capacidadesService
								.ObtenerProvincias(coddep));
					}
				}

				if (accion.equals("REFRESCARDEP")) {
					obj.setCodpro("0");
					codpro = null;
				}

				if (codpro != null) {
					obj.setCodpro(codpro);
					if (!codpro.equals("") & !(codpro.equals("0"))) {
						obj.setDistritos(capacidadesService.ObtenerDistritos(
								coddep, codpro));
					}
				}
			} else
				obj.setAccion("REFRESCAR");

			if (idNivelGobierno == Enumerados.NivelGobiernoConSector.NACIONAL
					.getCodigo())
				obj.setSectores(capacidadesService.ObtenerSectors());

			// busco el test activo
			Iterator itrT = null;
			Test t = null;
			itrT = obj.getTest().iterator();
			if (itrT != null) {
				Integer total_rows = obj.getTest().size();
				Integer row = 0;
				while (itrT.hasNext()) {
					row += 1;
					t = (Test) itrT.next();
					if (t.getActivo().equals("S")) {
						if (idTest == null)
							idTest = t.getId_test().intValue();
						obj.setTestActivo(t.getTest());
					}
				}
			}

			/*
			 * if (idTest == null) { idTest =
			 * obj.getTest().getFirst().getId_test().intValue();
			 * obj.setIdTest(idTest); } else { obj.setIdTest(idTest); }
			 */

			// String codPerfil = null;
			Number idPuestoTipo = null;
			/*
			 * codPerfil = request.getParameter("codPerfil");
			 * obj.setOptPerfiles(capacidadesService.ObtenerPerfiles()); if
			 * (codPerfil != null && !codPerfil.equals(""))
			 * obj.setCodPerfil(codPerfil);
			 */
			if (request.getParameter("id_puesto_tipo") != null
					&& !request.getParameter("id_puesto_tipo").equals(""))
				idPuestoTipo = Integer.parseInt(request
						.getParameter("id_puesto_tipo"));

			obj.setId_puesto_tipo(idPuestoTipo);

			obj.setIdTest(idTest);
			obj.setIdNivelGobierno(idNivelGobierno);
			obj.setIdSector(idSector);
			obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
			obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());

			obj.setCodProfesion(codProfesion);
			obj.setRegimens(regimens);
			obj.setCorreo(correo.toUpperCase());
			obj.setFecRegistro(fecRegistro);
			obj.setFecValidacion(fecValidacion);
			if (idNivelGobierno == 2)
				obj.setSectors(capacidadesService.ObtenerSectors());

			obj.setSistemas(capacidadesService.ObtenerSistema());

			idSistema = 0;
			if (request.getParameter("idSistema") != null) {
				idSistema = Integer.parseInt(request.getParameter("idSistema"));
				obj.setIdSistema(idSistema);
			}
			if (request.getParameter("idAmbito") != null
					&& request.getParameter("idAmbito") != "") {
				idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
			}

			if (accion != null && accion.equals("REFRESCARSISTEMA")) {
				idAmbito = 0;
			}

			obj.setIdAmbito(idAmbito);
			if (idSistema != 0) {
				Iterator itr = null;
				Sistema s = null;
				itr = obj.getSistemas().iterator();
				if (itr != null) {
					Integer total_rows = obj.getSistemas().size();
					Integer row = 0;
					while (itr.hasNext()) {
						row += 1;
						s = (Sistema) itr.next();
						if (s.getId_sistema().intValue() == idSistema) {
							obj.setAmbitos(capacidadesService
									.ObtenerAmbito(idSistema));
							if (s.getCon_ambitos().equals("1")) {
								conAmbito = "1";

							} else {
								idAmbito = obj.getAmbitos().getFirst()
										.getId_ambito().intValue();
								obj.setIdAmbito(idAmbito);
							}

						}
					}
				}
			}
			if (idSistema == 0)
				idAmbito = 0;
			obj.setConAmbito(conAmbito);
			if (idSistema > 0 && idAmbito > 0)
				obj.setTest(capacidadesService.ObtenerTestDiagnostico(idAmbito));
			// set valores de los controles

			// Recuperamos la lista de Puestos Tipo
			List<PuestoTipo> optPuestoTipo = mantenimientoService
					.getPuestoTipos(idSistema);
			obj.setOptPuestoTipo(optPuestoTipo);

			obj.setAccion(accion);
			if (accion != null) {
				String nombres = (String) request.getParameter("nombres");
				if (nombres != null)
					obj.setNombres(nombres.toUpperCase().trim());
				String apellidosPaterno = (String) request
						.getParameter("apellidosPaterno");
				if (apellidosPaterno != null)
					obj.setApellidos_paterno(apellidosPaterno.toUpperCase()
							.trim());
				String apellidosMaterno = (String) request
						.getParameter("apellidosMaterno");
				if (apellidosMaterno != null)
					obj.setApellidos_materno(apellidosMaterno.toUpperCase()
							.trim());
				String dni = (String) request.getParameter("dni");
				if ((String) request.getParameter("correo") != null)
					correo = (String) request.getParameter("correo");
				if (dni != null)
					obj.setDni(dni.trim());
				if (coddep != null)
					obj.setCoddep(coddep);
				if (codpro != null)
					obj.setCodpro(codpro);
				if (coddis != null)
					obj.setCoddis(coddis);

			}

			// accion = obj.getAccion();
			obj.setMensaje("");
			estadoRegistro = (String) request.getParameter("estadoRegistro");

			if (accion != null)
				if (accion.equals("DEL")) {
					Integer idParticipante = 0;
					if (request.getParameter("idParticipante") != null
							& !request.getParameter("idParticipante")
									.equals(""))
						idParticipante = Integer.parseInt(request.getParameter(
								"idParticipante").toString());
					censoService.eliminarParticipante(idParticipante);
					accion = "BUSCAR";
					obj.setMensaje("Se eliminó al participante.");
				}

			if (accion != null) {
				if (!accion.equals("BUSCAR"))
					objPrevio = (ParticipanteBusqueda) session
							.getAttribute("OBJ_PARTIC_BUSQ");
				if (accion.equals("BUSCAR"))
					session.setAttribute("OBJ_PARTIC_BUSQ", obj);
			}
		} else {
			obj = (ParticipanteBusqueda) session
					.getAttribute("OBJ_PARTIC_BUSQ");
			accion = obj.getAccion();
		}

		if (accion != null) {
			if (accion.equals("ELIMINARPARTICIPANTES")) {
				String lsql = (String) session.getAttribute("QUERY");
				censoService.eliminarParticipantes(lsql);
			}
		}
		List RptResponsables = null;
		String vSql = "";
		if (accion != null)
			if (accion.equals("BUSCAR")) {
				vSql = censoService.obtenerQueryParticipanteBusqueda(obj);
				RptResponsables = censoService
						.obtenerParticipanteBusqueda(vSql);
				session.setAttribute("QUERY", vSql);
			} else {
				if (objPrevio != null) {
					vSql = censoService
							.obtenerQueryParticipanteBusqueda(objPrevio);
					RptResponsables = censoService
							.obtenerParticipanteBusqueda(vSql);
					session.setAttribute("QUERY", vSql);
				}
			}

		if (obj.getMensaje().equals("")) {
			if (accion == null)
				obj.setMensaje("Seleccione criterios de búsqueda");
			if (RptResponsables == null)
				obj.setMensaje("Sin resultados para mostrar.");
			if (RptResponsables != null && RptResponsables.size() == 0)
				obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
			if (RptResponsables != null && RptResponsables.size() == 1)
				obj.setMensaje("Total: " + RptResponsables.size()
						+ " coincidencia para los filtros seleccionados.");
			if (RptResponsables != null && RptResponsables.size() > 1)
				obj.setMensaje("Total: " + RptResponsables.size()
						+ " coincidencias para los filtros seleccionados.");
		}
		request.setAttribute("DATALIST", RptResponsables);
		obj.setAccion("BUSCAR");

		if (RptResponsables != null) {
			if (RptResponsables.size() > 0)
				obj.setConResultado("1");
			else
				obj.setConResultado("0");
		} else {
			obj.setConResultado("0");
		}

		obj.setAccion(accion);

		if (estadoRegistro != null)
			obj.setEstadoRegistro(estadoRegistro);
		obj.setUsuario(usuario);
		
		System.out.println("QUERY = "+vSql);
		return obj;
	}
}
